import BaseVenueProcessor from './BaseVenueProcessor.js';
import { getWeiAoVenueSettings } from '../request.js';

/**
 * 为傲网球（香树店）场地数据处理器
 */
export class WeiAoXiangShuProcessor extends BaseVenueProcessor {
  constructor() {
    super();
    this.venueName = '为傲网球（香树店）';
  }

  /**
   * 获取为傲网球（香树店）场地预约设置
   * @param {Object} params - 查询参数 { companyId, storeId, customerId, motionCusId, rentVenueId, rentAreaId, calendar }
   * @returns {Promise} 请求Promise
   */
  async getVenueSettings(params = {}) {
    // 设置默认参数
    const defaultParams = {
      companyId: "4609",
      storeId: "5042",
      customerId: "3604632",
      motionCusId: "",
      rentVenueId: "863",
      rentAreaId: "2156",
      calendar: "2025-09-03"
    };
    
    // 合并参数
    const requestData = { ...defaultParams, ...params };
    
    return await getWeiAoVenueSettings(requestData);
  }

  /**
   * 验证数据是否有效
   * @param {Object} data - 原始场地数据
   * @returns {boolean} 数据是否有效
   */
  validateData(data) {
    console.log('validateData', data);
    
    const actualData = data.data || data;
    return actualData && 
           Array.isArray(actualData) && 
           actualData.length > 0 &&
           actualData.every(item => 
             item.rentVenueId && 
             item.rentAreaId && 
             item.timeStart && 
             item.timeEnd
           );
  }

  /**
   * 按场地名称分组
   * @param {Object} data - 原始场地数据
   * @returns {Map} 场地Map
   */
  groupVenues(data) {
    const venueMap = new Map();
    const actualData = data.data || data;
    
    actualData.forEach(item => {
      // 使用rentAreaName和rentVenueName组合作为场地名称
      const venueName = `${item.rentVenueName || '为傲网球'}(${item.rentAreaName || '香树店'})`;
      if (!venueMap.has(venueName)) {
        venueMap.set(venueName, {
          name: venueName,
          rentVenueId: item.rentVenueId,
          rentAreaId: item.rentAreaId,
          timeSlots: []
        });
      }
    });
    
    return venueMap;
  }

  /**
   * 处理时间槽
   * @param {Map} venueMap - 场地Map
   * @param {Object} data - 原始场地数据
   * @param {String} selectedDate - 选中的日期
   */
  processTimeSlots(venueMap, data, selectedDate) {
    const actualData = data.data || data;
    
    venueMap.forEach((venue, venueName) => {
      // 查找对应的场地
      const venueItems = actualData.filter(item => 
        `${item.rentVenueName || '为傲网球'}(${item.rentAreaName || '香树店'})` === venueName
      );
      
      if (venueItems.length === 0) return;
      
      // 遍历时间间隔信息
      venueItems.forEach(item => {
        // 将时间戳转换为时间字符串
        const startTime = new Date(item.timeStart);
        const endTime = new Date(item.timeEnd);
        
        // 规范化时间格式
        const formatTimeWithNormalization = (date) => {
          const hours = date.getHours();
          let minutes = date.getMinutes();
          
          // 规范化分钟数：0-14分钟显示为00，15-44分钟显示为30，45-59分钟显示为下一小时的00
          if (minutes >= 45) {
            return `${(hours + 1).toString().padStart(2, '0')}:00`;
          } else if (minutes >= 15) {
            minutes = 30;
          } else {
            minutes = 0;
          }
          
          return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
        };
        
        const startTimeStr = formatTimeWithNormalization(startTime);
        const endTimeStr = formatTimeWithNormalization(endTime);
        
        const timeSlot = `${startTimeStr}-${endTimeStr}`;
        
        // 格式化日期时间
        const beginDatetime = `${selectedDate} ${startTimeStr}:00`;
        const endDatetime = `${selectedDate} ${endTimeStr}:00`;
        
        // 检查场地状态 (status为0表示可预约，为1表示已占用)
        const isFree = item.status === 0;
        
        // 添加时间槽信息
        venue.timeSlots.push({
          time: timeSlot,
          isFree: isFree,
          price: parseFloat(item.cashPrice) || 30,
          beginDatetime: beginDatetime,
          endDatetime: endDatetime
        });
      });
    });
  }

  /**
   * 转换为场地列表
   * @param {Map} venueMap - 场地Map
   * @returns {Array} 场地列表
   */
  convertToVenueList(venueMap) {
    return Array.from(venueMap.values()).map((venue, index) => {
      // 根据场地名称设置价格
      let price = 30; // 默认价格
      
      return {
        id: 22000 + index, // 给为傲网球场地分配ID
        name: venue.name,
        address: "深圳市南山区西丽街道为傲路",
        latitude: 22.6123,
        longitude: 113.9724,
        phone: '0769-33445566',
        rating: 4.5,
        price: price,
        facilities: ['室内场地', '专业教练'],
        image: '',
        distance: 4.5,
        timeSlots: venue.timeSlots,
        dataSource: this.venueName
      };
    });
  }

  /**
   * 处理场地数据
   * @param {Object} data - 原始场地数据
   * @param {string} selectedDate - 选择的日期
   * @returns {Array} 处理后的场地列表
   */
  process(data, selectedDate) {
    this.selectedDate = selectedDate;
    
    // 验证数据
    if (!this.validateData(data)) {
      console.error('为傲网球数据验证失败');
      return [];
    }
    
    // 按场地名称分组
    const venueMap = this.groupVenues(data);
    
    // 处理时间槽
    this.processTimeSlots(venueMap, data, selectedDate);
    
    // 转换为场地列表
    return this.convertToVenueList(venueMap);
  }
}

export default WeiAoXiangShuProcessor;